import { Notify } from 'quasar';
import axios from 'axios';
import { useAuthStore } from 'src/stores/auth.js';

// 错误通知函数
const showErrorNotification = ({ message, caption }) => {
  Notify.create({
    message: message || 'Ooooops! An error occurred',
    caption: caption || 'Contact support for more information',
    color: 'negative',
  });
};

// 创建自定义 Axios 实例
const $axios = axios.create({
  baseURL: process.env.BASE_URL,
  withCredentials: true,
  // headers: {
  // 不要手动设置 Content-Type，否则会导致 boundary 缺失。axios 和 fetch 会自动为 FormData 设置正确的 Content-Type。
  //   'Content-Type': 'application/json', // 确保请求头为 JSON
  // },
});

// 添加 Axios 请求拦截器
$axios.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('access'); // 获取 Token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error),
);

// 响应拦截器
$axios.interceptors.response.use(
  (response) => response, // 正常响应直接返回
  (error) => {
    // 检查是否存在响应对象
    if (!error.response) {
      // console.error('Network or request error:', error.message);
      showErrorNotification({ message: 'Network Error', caption: 'Please check your connection.' });
      return Promise.reject(error);
    }

    const { status, statusText, data } = error.response;

    const strData = JSON.stringify(data);
    // 调试模式下的日志记录
    if (process.env.DEBUGGING) {
      // console.debug(`${status}: ${statusText} ${strData}`);
    }

    // 定义通知选项
    const notificationOptions = {
      message: `${status}: ${statusText} ${strData}`,
      caption: 'Contact support for more information',
    };

    // 根据状态码处理错误
    if (![333].includes(status)) {
      showErrorNotification(notificationOptions);
    }

    // 返回拒绝的 Promise，确保错误可以被后续捕获
    return Promise.reject(error);
  },
);

// 添加 Axios 响应拦截器
$axios.interceptors.response.use(
  (response) => response, // 正常响应直接返回
  async (error) => {
    const originalRequest = error.config; // 获取原始请求配置
    const store = useAuthStore(); // 获取 Auth Store 实例

    // 处理非响应错误（如网络异常）
    if (!error.response) {
      // console.error('Network or request error:', error.message);
      return Promise.reject(error);
    }

    const { status } = error.response;

    // 移除未使用的 'options' 变量
    if (process.env.DEBUGGING) {
      // console.debug(`${status} ${statusText}`);
    }

    // 使用更清晰的变量名代替 '_retry'
    if (status === 401 && !originalRequest.retryAttempted) {
      originalRequest.retryAttempted = true; // 标记该请求为已重试

      try {
        // 调用刷新 Token 方法
        const newToken = await store.refreshToken();

        // 更新请求头中的 Token
        originalRequest.headers.Authorization = `Bearer ${newToken}`;

        // 使用更新后的 Token 重新发送原始请求
        return axios(originalRequest);
      } catch (refreshError) {
        // 清除认证数据并跳转到登录页面
        store.clearAuthData();
        // store.router.push({ name: 'Login' });

        // 返回刷新 Token 的错误
        return Promise.reject(refreshError);
      }
    }

    // 对于其他错误，直接返回
    return Promise.reject(error);
  },
);

export default () => $axios;
export { $axios };
